package br.com.medvagas.comum.entidade;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


/**
 * The persistent class for the vaga database table.
 * 
 */
@Entity
@Table(name="vaga")
@NamedQueries({
	@NamedQuery(
		name="Vaga.consultarVagaEmpresa", 
		query="select new br.com.medvagas.comum.entidade.vo.VOConsultaVagaEmpresa(v.idVaga, v.identificaoVaga, v.especialidade.nome, v.numeroVagas, v.empresa.nomeFantasia, 0.0, v.prazoInscricao, v.stVagaUsuarioProfissional.size) from Vaga v where v.ativa = :ativa and v.dataExclusao is null order by v.prazoInscricao desc"),
	@NamedQuery(
		name="Vaga.pesquisarVaga", 
		query="select new br.com.medvagas.comum.entidade.vo.VOConsultaVaga(v.idVaga, v.especialidade.nome, v.numeroVagas, v.empresa.nomeFantasia, 0.0, v.prazoInscricao, (select vup.id.idUsuarioProfissional from VagaUsuarioProfissional vup where vup.id.idVaga = v.idVaga and vup.id.idUsuarioProfissional = :idUsuarioProfissional)) from Vaga v" +
				" where v.ativa = :ativa and v.dataExclusao is null" +
				" and (v.idProfissao = :idProfissao or :idProfissao is null)" +
				" and (v.idEspecialidade = :idEspecialidade or :idEspecialidade is null)" +
				" order by v.dataCadastro desc"),
	@NamedQuery(
		name="Vaga.consultarVagaCandidato", 
		query="select new br.com.medvagas.comum.entidade.vo.VOConsultaVaga(v.idVaga, v.especialidade.nome, v.numeroVagas, v.empresa.nomeFantasia, 0.0, v.prazoInscricao) from Vaga v inner join v.stVagaUsuarioProfissional vup where vup.id.idUsuarioProfissional = :idUsuarioProfissional and v.ativa = :ativa and v.dataExclusao is null order by v.dataCadastro desc")
})
public class Vaga implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id_vaga")
	private Integer idVaga;

	@Column(name="duracao_vinculo")
	private String duracaoVinculo;

	@Column(name="exibir_nome_fantasia")
	private Boolean exibirNomeFantasia;

	@Column(name="graduacao_medicina")
	private Boolean graduacaoMedicina;

	@Column(name="identificao_vaga")
	private String identificaoVaga;

	@Column(name="informacoes_adicionais_atividades")
	private String informacoesAdicionaisAtividades;

	@Column(name="informacoes_adicionais_geral")
	private String informacoesAdicionaisGeral;

	@Column(name="lingua_estrangeira")
	private Boolean linguaEstrangeira;

	@Column(name="numero_medio_pacientes")
	private Integer numeroMedioPacientes;

	@Column(name="numero_vagas")
	private Integer numeroVagas;

	@Column(name="outros_prerequisitos")
	private String outrosPrerequisitos;

    @Temporal(TemporalType.DATE)
	@Column(name="prazo_inscricao")
	private Date prazoInscricao;

	@Column(name="receber_email_candidato")
	private Boolean receberEmailCandidato;

	@Column(name="ritmo_atendimento")
	private Integer ritmoAtendimento;

	@Column(name="tipo_vinculo")
	private String tipoVinculo;

	@Column(name="tipo_vinculo_pessoa")
	private String tipoVinculoPessoa;

	@Column(name="titulo_especialista")
	private Boolean tituloEspecialista;

	@Column(name="unidade_numero_medio_pacientes")
	private String unidadeNumeroMedioPacientes;

	@Column(name="informacoes_adicionais_remuneracao")
	private String informacoesAdicionaisRemuneracao;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="data_cadastro")
	private Date dataCadastro;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="data_publicacao")
	private Date dataPublicacao;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="data_ultima_alteracao")
	private Date dataUltimaAlteracao;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="data_exclusao")
	private Date dataExclusao;
	
	@Column
	private Boolean ativa;
	
	//bi-directional one-to-one association to RemuneracaoConsulta
	@OneToOne(mappedBy="vaga", fetch=FetchType.LAZY)
	private RemuneracaoConsulta remuneracaoConsulta;

	//bi-directional one-to-one association to RemuneracaoPlantao
	@OneToOne(mappedBy="vaga", fetch=FetchType.LAZY)
	private RemuneracaoPlantao remuneracaoPlantao;

	//bi-directional one-to-one association to RemuneracaoSalario
	@OneToOne(mappedBy="vaga", fetch=FetchType.LAZY)
	private RemuneracaoSalario remuneracaoSalario;

	//bi-directional many-to-one association to Empresa
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="id_empresa", insertable=false, updatable=false)
	private Empresa empresa;
	@Column(name="id_empresa")
	private Integer idEmpresa;

	//bi-directional many-to-many association to UsuarioProfissional
//    @ManyToMany(fetch=FetchType.LAZY)
//	@JoinTable(
//		name="vaga_usuario_profissional"
//		, joinColumns={@JoinColumn(name="id_vaga")}
//		, inverseJoinColumns={@JoinColumn(name="id_usuario_profissional")})
//	private Set<UsuarioProfissional> stUsuarioProfissional;
    
	//bi-directional many-to-one association to VagaUsuarioProfissional
	@OneToMany(mappedBy="vaga")
	private Set<VagaUsuarioProfissional> stVagaUsuarioProfissional;
    
	//bi-directional many-to-one association to Beneficio
	@OneToMany(mappedBy="vaga", fetch=FetchType.LAZY)
	private Set<Beneficio> stBeneficio;

	//bi-directional many-to-one association to TipoAtendimento
	@OneToMany(mappedBy="vaga", fetch=FetchType.LAZY)
	private Set<TipoAtendimento> stTipoAtendimento;

	//bi-directional many-to-one association to Especialidade
    @ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="id_especialidade", insertable=false, updatable=false)
	private Especialidade especialidade;
    @Column(name="id_especialidade")
    private Integer idEspecialidade;

	//bi-directional many-to-one association to Profissao
    @ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="id_profissao", insertable=false, updatable=false)
	private Profissao profissao;
    @Column(name="id_profissao")
    private Integer idProfissao;
	
    public Vaga() {
    }

	public Integer getIdVaga() {
		return this.idVaga;
	}

	public void setIdVaga(Integer idVaga) {
		this.idVaga = idVaga;
	}

	public String getDuracaoVinculo() {
		return this.duracaoVinculo;
	}

	public void setDuracaoVinculo(String duracaoVinculo) {
		this.duracaoVinculo = duracaoVinculo;
	}

	public Boolean getExibirNomeFantasia() {
		return this.exibirNomeFantasia;
	}

	public void setExibirNomeFantasia(Boolean exibirNomeFantasia) {
		this.exibirNomeFantasia = exibirNomeFantasia;
	}

	public Boolean getGraduacaoMedicina() {
		return this.graduacaoMedicina;
	}

	public void setGraduacaoMedicina(Boolean graduacaoMedicina) {
		this.graduacaoMedicina = graduacaoMedicina;
	}

	public String getIdentificaoVaga() {
		return this.identificaoVaga;
	}

	public void setIdentificaoVaga(String identificaoVaga) {
		this.identificaoVaga = identificaoVaga;
	}

	public String getInformacoesAdicionaisAtividades() {
		return this.informacoesAdicionaisAtividades;
	}

	public void setInformacoesAdicionaisAtividades(String informacoesAdicionaisAtividades) {
		this.informacoesAdicionaisAtividades = informacoesAdicionaisAtividades;
	}

	public String getInformacoesAdicionaisGeral() {
		return this.informacoesAdicionaisGeral;
	}

	public void setInformacoesAdicionaisGeral(String informacoesAdicionaisGeral) {
		this.informacoesAdicionaisGeral = informacoesAdicionaisGeral;
	}

	public Boolean getLinguaEstrangeira() {
		return this.linguaEstrangeira;
	}

	public void setLinguaEstrangeira(Boolean linguaEstrangeira) {
		this.linguaEstrangeira = linguaEstrangeira;
	}

	public Integer getNumeroMedioPacientes() {
		return this.numeroMedioPacientes;
	}

	public void setNumeroMedioPacientes(Integer numeroMedioPacientes) {
		this.numeroMedioPacientes = numeroMedioPacientes;
	}

	public Integer getNumeroVagas() {
		return this.numeroVagas;
	}

	public void setNumeroVagas(Integer numeroVagas) {
		this.numeroVagas = numeroVagas;
	}

	public String getOutrosPrerequisitos() {
		return this.outrosPrerequisitos;
	}

	public void setOutrosPrerequisitos(String outrosPrerequisitos) {
		this.outrosPrerequisitos = outrosPrerequisitos;
	}

	public Date getPrazoInscricao() {
		return this.prazoInscricao;
	}

	public void setPrazoInscricao(Date prazoInscricao) {
		this.prazoInscricao = prazoInscricao;
	}

	public Boolean getReceberEmailCandidato() {
		return this.receberEmailCandidato;
	}

	public void setReceberEmailCandidato(Boolean receberEmailCandidato) {
		this.receberEmailCandidato = receberEmailCandidato;
	}

	public Integer getRitmoAtendimento() {
		return this.ritmoAtendimento;
	}

	public void setRitmoAtendimento(Integer ritmoAtendimento) {
		this.ritmoAtendimento = ritmoAtendimento;
	}

	public String getTipoVinculo() {
		return this.tipoVinculo;
	}

	public void setTipoVinculo(String tipoVinculo) {
		this.tipoVinculo = tipoVinculo;
	}

	public String getTipoVinculoPessoa() {
		return this.tipoVinculoPessoa;
	}

	public void setTipoVinculoPessoa(String tipoVinculoPessoa) {
		this.tipoVinculoPessoa = tipoVinculoPessoa;
	}

	public Boolean getTituloEspecialista() {
		return this.tituloEspecialista;
	}

	public void setTituloEspecialista(Boolean tituloEspecialista) {
		this.tituloEspecialista = tituloEspecialista;
	}

	public String getUnidadeNumeroMedioPacientes() {
		return this.unidadeNumeroMedioPacientes;
	}

	public void setUnidadeNumeroMedioPacientes(String unidadeNumeroMedioPacientes) {
		this.unidadeNumeroMedioPacientes = unidadeNumeroMedioPacientes;
	}

	public RemuneracaoConsulta getRemuneracaoConsulta() {
		return remuneracaoConsulta;
	}

	public void setRemuneracaoConsulta(RemuneracaoConsulta remuneracaoConsulta) {
		this.remuneracaoConsulta = remuneracaoConsulta;
	}

	public RemuneracaoPlantao getRemuneracaoPlantao() {
		return remuneracaoPlantao;
	}

	public void setRemuneracaoPlantao(RemuneracaoPlantao remuneracaoPlantao) {
		this.remuneracaoPlantao = remuneracaoPlantao;
	}

	public RemuneracaoSalario getRemuneracaoSalario() {
		return remuneracaoSalario;
	}

	public void setRemuneracaoSalario(RemuneracaoSalario remuneracaoSalario) {
		this.remuneracaoSalario = remuneracaoSalario;
	}

	public Empresa getEmpresa() {
		return this.empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

//	public Set<UsuarioProfissional> getStUsuarioProfissional() {
//		return stUsuarioProfissional;
//	}
//
//	public void setStUsuarioProfissional(Set<UsuarioProfissional> stUsuarioProfissional) {
//		this.stUsuarioProfissional = stUsuarioProfissional;
//	}

	public Set<Beneficio> getStBeneficio() {
		return this.stBeneficio;
	}

	public void setStBeneficio(Set<Beneficio> stBeneficio) {
		this.stBeneficio = stBeneficio;
	}
	
	public Set<TipoAtendimento> getStTipoAtendimento() {
		return this.stTipoAtendimento;
	}

	public void setStTipoAtendimento(Set<TipoAtendimento> stTipoAtendimento) {
		this.stTipoAtendimento = stTipoAtendimento;
	}

	public Especialidade getEspecialidade() {
		return especialidade;
	}

	public void setEspecialidade(Especialidade especialidade) {
		this.especialidade = especialidade;
	}

	public Profissao getProfissao() {
		return profissao;
	}

	public void setProfissao(Profissao profissao) {
		this.profissao = profissao;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public Integer getIdProfissao() {
		return idProfissao;
	}

	public void setIdProfissao(Integer idProfissao) {
		this.idProfissao = idProfissao;
	}

	public Integer getIdEspecialidade() {
		return idEspecialidade;
	}

	public void setIdEspecialidade(Integer idEspecialidade) {
		this.idEspecialidade = idEspecialidade;
	}

	public Integer getIdEmpresa() {
		return idEmpresa;
	}

	public void setIdEmpresa(Integer idEmpresa) {
		this.idEmpresa = idEmpresa;
	}

	public Boolean getAtiva() {
		return ativa;
	}

	public void setAtiva(Boolean ativa) {
		this.ativa = ativa;
	}

	public Date getDataPublicacao() {
		return dataPublicacao;
	}

	public void setDataPublicacao(Date dataPublicacao) {
		this.dataPublicacao = dataPublicacao;
	}

	public Date getDataUltimaAlteracao() {
		return dataUltimaAlteracao;
	}

	public void setDataUltimaAlteracao(Date dataUltimaAlteracao) {
		this.dataUltimaAlteracao = dataUltimaAlteracao;
	}

	public Date getDataExclusao() {
		return dataExclusao;
	}

	public void setDataExclusao(Date dataExclusao) {
		this.dataExclusao = dataExclusao;
	}

	public Set<VagaUsuarioProfissional> getStVagaUsuarioProfissional() {
		return stVagaUsuarioProfissional;
	}

	public void setStVagaUsuarioProfissional(Set<VagaUsuarioProfissional> vagaUsuarioProfissional) {
		this.stVagaUsuarioProfissional = vagaUsuarioProfissional;
	}

	public String getInformacoesAdicionaisRemuneracao() {
		return informacoesAdicionaisRemuneracao;
	}

	public void setInformacoesAdicionaisRemuneracao(String informacoesAdicionaisRemuneracao) {
		this.informacoesAdicionaisRemuneracao = informacoesAdicionaisRemuneracao;
	}
	
}